package moonstruckdrops.dao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;

import com.google.appengine.api.datastore.Text;

import moonstruckdrops.dao.PMF;
import moonstruckdrops.dto.EntryDto;

public class EntryDao implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	/**
	 * 新規エントリーの保存
	 * @param NewEntry 新規エントリー
	 */
	public void NewEntrySave(EntryDto NewEntry){
		PersistenceManager	pm = PMF.get().getPersistenceManager();
		try{
			pm.makePersistent(NewEntry);
		}finally{
			pm.close();
		}
	}
	
	/**
	 * 全エントリーの取得
	 * @return 全エントリー
	 */
	public List<EntryDto> getEntry(){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		List<EntryDto> result;
		ArrayList<EntryDto> EntryData=new ArrayList<EntryDto>();
		try{
			Query query = pm.newQuery(EntryDto.class);
			query.setOrdering("Date desc");
			result = (List<EntryDto>) pm.newQuery(query).execute();
			pm.detachCopyAll(result);
		}finally{
			pm.close();
		}
		for(EntryDto dlist : result){
			EntryData.add(new EntryDto(dlist.getId(),dlist.getDate(),dlist.getTitle(),dlist.getEntry()));
		}
		return EntryData;
	}
	
	/**
	 * エントリーの取得
	 * @param first 初期
	 * @param count 個数
	 * @return エントリー
	 */
	public List<EntryDto> getEntry(int first,int count){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		List<EntryDto> result;
		ArrayList<EntryDto> EntryData=new ArrayList<EntryDto>();
		int end=first+count;
		try{
			Query query = pm.newQuery(EntryDto.class);
			query.setOrdering("Date desc");
			query.setRange(first,end);
			result = (List<EntryDto>) pm.newQuery(query).execute();
			pm.detachCopyAll(result);
		}finally{
			pm.close();
		}
		for(EntryDto dlist : result){
			EntryData.add(new EntryDto(dlist.getId(),dlist.getDate(),dlist.getTitle(),dlist.getEntry()));
		}
		return EntryData;
	}
		
				
	/**
	 * エントリーのサイズの取得
	 * @return エントリーのサイズ
	 */
	public int EntrySize(){
		PersistenceManager pm = PMF.get().getPersistenceManager();
		List<EntryDto> result;
		try{
			Query query = pm.newQuery(EntryDto.class);
			query.setOrdering("Date desc");
			result = (List<EntryDto>) pm.newQuery(query).execute();
			pm.detachCopyAll(result);
		}finally{
			pm.close();
		}
		return result.size();
	}
		
	/**
	 * エントリーの更新
	 * @param id エントリーID
	 * @param Title エントリーのタイトル
	 * @param Content エントリーのコメント
	 */
	public void UpDateEntry(Long id,String Title,Text Content){
		PersistenceManager pm =PMF.get().getPersistenceManager();
		Transaction transaction = pm.currentTransaction();
		transaction.begin();
		try{
			EntryDto Entry = pm.getObjectById(EntryDto.class,id);
			Entry.setTitle(Title);
			Entry.setEntry(Content);
			transaction.commit();
		}finally{
			if(transaction.isActive()){
				transaction.rollback();
			}
		}
	}
}
